trigger: none

pr:
  branches:
    include:
    - "*"

schedules:
- cron: "0 13 * * *" # 1PM UTC => 5 AM PST
  displayName: HttpStress nightly run
  branches:
    include:
    - main
    - release/6.0
    - release/7.0
    - release/8.0

variables:
  - template: ../variables.yml
  - name: dockerfilesFolder
    value: $(Build.SourcesDirectory)/eng/docker
  - name: httpStressProject
    value: $(sourcesRoot)/System.Net.Http/tests/StressTests/HttpStress
  - name: sdkBaseImage
    value: dotnet-sdk-libraries-current


extends:
  template:  /eng/pipelines/common/templates/pipeline-with-resources.yml
  parameters:
    stages:
    - stage: Build
      jobs:
      - job: linux
        displayName: Docker Linux
        timeoutInMinutes: 240
        variables:
          DUMPS_SHARE_MOUNT_ROOT: "/dumps-share"
        pool:
          name: $(DncEngPublicBuildPool)
          demands: ImageOverride -equals 1es-ubuntu-1804-open

        steps:
        - checkout: self
          clean: true
          fetchDepth: 5

        - bash: |
            $(dockerfilesFolder)/build-docker-sdk.sh -t $(sdkBaseImage) -c $(BUILD_CONFIGURATION) && \
            echo "##vso[task.setvariable variable=succeeded;isOutput=true]true"
          name: buildRuntime
          displayName: Build CLR and Libraries

        - bash: |
            $(httpStressProject)/run-docker-compose.sh -o -c $(BUILD_CONFIGURATION) -t $(sdkBaseImage) && \
            echo "##vso[task.setvariable variable=succeeded;isOutput=true]true"
          name: buildStress
          displayName: Build HttpStress

        - bash: |
            cd '$(httpStressProject)'
            export CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/3.0"
            export SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/3.0"
            export HTTPSTRESS_CLIENT_ARGS="$HTTPSTRESS_CLIENT_ARGS -http 3.0"
            export HTTPSTRESS_SERVER_ARGS="$HTTPSTRESS_SERVER_ARGS -http 3.0"
            docker-compose up --abort-on-container-exit --no-color
          timeoutInMinutes: 35 # In case the HTTP/3.0 run hangs, we timeout shortly after the expected 30 minute run
          displayName: Run HttpStress - HTTP 3.0
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - bash: |
            cd '$(httpStressProject)'
            export CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/2.0"
            export SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/2.0"
            export HTTPSTRESS_CLIENT_ARGS="$HTTPSTRESS_CLIENT_ARGS -http 2.0"
            export HTTPSTRESS_SERVER_ARGS="$HTTPSTRESS_SERVER_ARGS -http 2.0"
            docker-compose up --abort-on-container-exit --no-color
          displayName: Run HttpStress - HTTP 2.0
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - bash: |
            cd '$(httpStressProject)'
            export CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/1.1"
            export SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/1.1"
            export HTTPSTRESS_CLIENT_ARGS="$HTTPSTRESS_CLIENT_ARGS -http 1.1"
            export HTTPSTRESS_SERVER_ARGS="$HTTPSTRESS_SERVER_ARGS -http 1.1"
            docker-compose up --abort-on-container-exit --no-color
          displayName: Run HttpStress - HTTP 1.1
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - bash: |
            sudo chown -R $(id -u):$(id -g) $(Build.ArtifactStagingDirectory)/dumps
          displayName: Own shared dumps and files
          condition: failed()

        - publish: $(Build.ArtifactStagingDirectory)/dumps
          artifact: DumpsLinux
          condition: failed()

      - job: windows
        displayName: Docker NanoServer
        timeoutInMinutes: 150
        variables:
          DUMPS_SHARE_MOUNT_ROOT: "C:/dumps-share"

          # The 1es-windows-2022-open image has an issue where the Chocolatey-installed V1 docker-compose takes precendence over the
          # V2 docker-compose required by the stress tests, see: https://github.com/actions/runner-images/issues/7080
          # This is worked around by handpicking the V2 executable.
          # The workaround should be removed when the official fix is propagated into 1es-windows-2022-open, or when we switch to another image.
          DOCKER_COMPOSE_CMD: "C:/ProgramData/docker/cli-plugins/docker-compose.exe"
        pool:
          name: $(DncEngPublicBuildPool)
          demands: ImageOverride -equals 1es-windows-2022-open

        steps:
        - checkout: self
          clean: true
          fetchDepth: 5
          lfs: false

        - powershell: |
            # Workaround for https://github.com/microsoft/azure-pipelines-agent/issues/4554. Undo when the image bug is fixed.
            Remove-Item -Path "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\Microsoft.VCToolsVersion.v143.default.txt"

            $(dockerfilesFolder)/build-docker-sdk.ps1 -w -t $(sdkBaseImage) -c $(BUILD_CONFIGURATION)
            echo "##vso[task.setvariable variable=succeeded;isOutput=true]true"
          name: buildRuntime
          displayName: Build CLR and Libraries

        - powershell: |
            $(httpStressProject)/run-docker-compose.ps1 -w -o -c $(BUILD_CONFIGURATION) -t $(sdkBaseImage)
            echo "##vso[task.setvariable variable=succeeded;isOutput=true]true"
          name: buildStress
          displayName: Build HttpStress

          # Firewall is disabled for the test runs, since it can lead to unexpected TCP failures on CI machines, which are unrelated to the HTTP logic.
          # See: https://github.com/dotnet/runtime/issues/50854
        - powershell: |
            Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled False
          name: disableFirewall
          displayName: Disable Firewall

        - powershell: |
            cd '$(httpStressProject)'
            $env:CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/3.0"
            $env:SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/3.0"
            New-Item -Force $env:CLIENT_DUMPS_SHARE -ItemType Directory
            New-Item -Force $env:SERVER_DUMPS_SHARE -ItemType Directory
            $env:HTTPSTRESS_CLIENT_ARGS = "$env:HTTPSTRESS_CLIENT_ARGS -http 3.0"
            $env:HTTPSTRESS_SERVER_ARGS = "$env:HTTPSTRESS_SERVER_ARGS -http 3.0"
            & $env:DOCKER_COMPOSE_CMD up --abort-on-container-exit --no-color
          displayName: Run HttpStress - HTTP 3.0
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - powershell: |
            cd '$(httpStressProject)'
            $env:CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/2.0"
            $env:SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/2.0"
            New-Item -Force $env:CLIENT_DUMPS_SHARE -ItemType Directory
            New-Item -Force $env:SERVER_DUMPS_SHARE -ItemType Directory
            $env:HTTPSTRESS_CLIENT_ARGS = "$env:HTTPSTRESS_CLIENT_ARGS -http 2.0"
            $env:HTTPSTRESS_SERVER_ARGS = "$env:HTTPSTRESS_SERVER_ARGS -http 2.0"
            & $env:DOCKER_COMPOSE_CMD up --abort-on-container-exit --no-color
          displayName: Run HttpStress - HTTP 2.0
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - powershell: |
            cd '$(httpStressProject)'
            $env:CLIENT_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/client/1.1"
            $env:SERVER_DUMPS_SHARE="$(Build.ArtifactStagingDirectory)/dumps/server/1.1"
            New-Item -Force $env:CLIENT_DUMPS_SHARE -ItemType Directory
            New-Item -Force $env:SERVER_DUMPS_SHARE -ItemType Directory
            $env:HTTPSTRESS_CLIENT_ARGS = "$env:HTTPSTRESS_CLIENT_ARGS -http 1.1"
            $env:HTTPSTRESS_SERVER_ARGS = "$env:HTTPSTRESS_SERVER_ARGS -http 1.1"
            & $env:DOCKER_COMPOSE_CMD up --abort-on-container-exit --no-color
          displayName: Run HttpStress - HTTP 1.1
          condition: and(eq(variables['buildRuntime.succeeded'], 'true'), eq(variables['buildStress.succeeded'], 'true'))

        - publish: $(Build.ArtifactStagingDirectory)/dumps
          artifact: DumpsWindows
          condition: failed()

        - powershell: |
            Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled True
          name: enableFirewall
          displayName: Enable Firewall
